Angular অ্যাপ্লিকেশন তৈরি করার সময়, সার্ভিসগুলি গুরুত্বপূর্ণ রোল পালন করে এবং সেগুলির টেস্টিং নিশ্চিত করতে হয়। ডিপেন্ডেন্সি ইনজেকশন (DI) ব্যবস্থার কারণে, সার্ভিসগুলি বিভিন্ন কম্পোনেন্টে ইনজেক্ট হয় এবং সঠিকভাবে টেস্ট করা প্রয়োজন। Angular-এ টেস্টিংয়ের জন্য আমরা সাধারণত Jasmine এবং Karma ব্যবহার করি, তবে আপনি টেস্টিংয়ের জন্য অন্য টুলও ব্যবহার করতে পারেন।
Angular-এ সার্ভিস টেস্ট করার সময়, যদি সার্ভিসটি অন্য সার্ভিস বা ডিপেন্ডেন্সি ব্যবহার করে, তাহলে DI ব্যবস্থার মাধ্যমে সেই ডিপেন্ডেন্সি মক (mock) বা স্টাব (stub) করে টেস্ট করা হয়।
ধরা যাক, আপনার একটি সার্ভিস DataService
রয়েছে, যা একটি HTTP সার্ভিসের মাধ্যমে ডেটা ফেচ করে। এই সার্ভিসের টেস্ট করার সময়, আমরা HTTP রিকোয়েস্টগুলিকে মক করে এবং সার্ভিসটির কার্যকারিতা যাচাই করি।
DataService
সার্ভিসের উদাহরণimport { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
constructor(private http: HttpClient) {}
fetchData(): Observable<any> {
return this.http.get('https://api.example.com/data');
}
}
এই সার্ভিসটি HttpClient
ব্যবহার করে ডেটা ফেচ করে এবং Observable
হিসেবে রিটার্ন করে।
TestBed ব্যবহার করে DataService
-এর টেস্ট কনফিগারেশন করা হয়। আমরা HttpClientTestingModule
ব্যবহার করব, যা HTTP রিকোয়েস্ট মক করতে সহায়ক।
import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { DataService } from './data.service';
describe('DataService', () => {
let service: DataService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [DataService]
});
service = TestBed.inject(DataService);
httpMock = TestBed.inject(HttpTestingController);
});
afterEach(() => {
httpMock.verify(); // নিশ্চিত করে যে কোনো অনাকাঙ্ক্ষিত HTTP কল হয়নি
});
it('should be created', () => {
expect(service).toBeTruthy();
});
it('should fetch data from the API', () => {
const mockData = { name: 'John', age: 30 };
service.fetchData().subscribe(data => {
expect(data).toEqual(mockData); // আসল ডেটার সাথে মক ডেটা তুলনা
});
const req = httpMock.expectOne('https://api.example.com/data');
expect(req.request.method).toBe('GET'); // নিশ্চিত করা যে GET রিকোয়েস্ট হয়েছে
req.flush(mockData); // মক ডেটা পাঠানো
});
});
TestBed.configureTestingModule
ব্যবহার করে আমরা আমাদের সার্ভিস এবং প্রয়োজনীয় মডিউলগুলি কনফিগার করি।HttpClientTestingModule
: এটি HttpClient
-এর HTTP রিকোয়েস্টগুলিকে মক করে দেয়।providers
: সার্ভিসটি প Providers অ্যারে দ্বারা ইনজেক্ট করা হয়।TestBed.inject()
দিয়ে সার্ভিস এবং HTTP মক কন্ট্রোলারকে ইনজেক্ট করি।httpMock.verify()
ব্যবহার করে নিশ্চিত করি যে কোনো অবাঞ্চিত HTTP রিকোয়েস্ট হয়নি।fetchData()
মেথডটি ঠিকমতো ডেটা ফেরত দিচ্ছে কিনা পরীক্ষা করে।httpMock.expectOne()
মাধ্যমে আমরা পরীক্ষা করি যে নির্দিষ্ট API URL-এ একটিই HTTP GET রিকোয়েস্ট হচ্ছে।req.flush(mockData)
মক ডেটা সার্ভিসে পাঠানোর জন্য ব্যবহৃত হয়।যখন আপনার সার্ভিসের কোনো নির্দিষ্ট ডিপেন্ডেন্সি থাকে, যেমন অন্য সার্ভিস বা মডিউল, তখন সেগুলিকে মক করা হয়। উদাহরণস্বরূপ, আপনি যদি সার্ভিসের ভেতরে AuthService
বা LoggerService
ইনজেক্ট করেন, তবে আপনি এই ডিপেন্ডেন্সিগুলোকে মক (mock) করে টেস্ট করতে পারেন।
import { AuthService } from './auth.service';
describe('DataService', () => {
let service: DataService;
let authServiceMock: jasmine.SpyObj<AuthService>;
beforeEach(() => {
authServiceMock = jasmine.createSpyObj('AuthService', ['isAuthenticated']);
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
DataService,
{ provide: AuthService, useValue: authServiceMock } // AuthService মক করা
]
});
service = TestBed.inject(DataService);
});
it('should call isAuthenticated method of AuthService', () => {
authServiceMock.isAuthenticated.and.returnValue(true); // মক রিটার্ন ভ্যালু
service.fetchData(); // সার্ভিসের মেথড কল
expect(authServiceMock.isAuthenticated).toHaveBeenCalled(); // মক মেথড কল চেক করা
});
});
এখানে, AuthService
মক করা হয়েছে এবং আমরা পরীক্ষা করেছি যে isAuthenticated
মেথডটি DataService
থেকে ঠিকমতো কল হচ্ছে কিনা।
এইভাবে, Angular-এ ডিপেন্ডেন্সি ইনজেকশনের সাথে সার্ভিস টেস্টিং করা একটি শক্তিশালী উপায় হতে পারে যাতে অ্যাপ্লিকেশনের কার্যকারিতা এবং নির্ভরযোগ্যতা বজায় রাখা যায়।
Read more